home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok85 / streams / streams1.mod < prev    next >
Text File  |  1993-11-04  |  5KB  |  206 lines

  1. (*------------------------------------------
  2.  
  3.   :Program.     Streams
  4.   :Author.      Dieter Bogdoll [db]
  5.   :Address.     SMail: Gudrunstr. 7, D-8000 München 19
  6.   :Address.     EMail: landon@amc.zer
  7.   :Address.     EMail: 2:246/221.3@fidonet
  8.   :Address.     EMail: bogdoll@informatik.tu-muenchen.de
  9.   :Version.     V1.0g
  10.   :Date.        20-Feb-1993
  11.   :Copyright.   Public Domain
  12.   :Language.    Oberon
  13.   :Translator.  Amiga Oberon 3.00d
  14.   :Support.     Objektorientierte Programmierung in Oberon-2
  15.   :Contents.    abstrakte Datenmodel Streams
  16.   :Contents.    Zeichenstroeme fuer Zeichenein/ausgabe
  17.   :Contents.    sei es per Console oder Files
  18.   :Bugs.        nicht ausfuehrlich getestet
  19.   :History.     V0.0   [db] 15-Feb-1993 : Erstellt
  20.   :History.     V0.1   [db] 19-Feb-1993 : sollte fuer alle Oberon-Compiler
  21.   :History.                               geeignet sein
  22.   :History.     V1.0g  [db] 20-Feb-1993 : Gebrauchsfertig
  23.  
  24. --------------------------------------------*)
  25. MODULE Streams;
  26.  
  27. IMPORT e:=Exec, y:=SYSTEM;
  28.  
  29. CONST
  30.   eof = 1CX;
  31.  
  32. TYPE
  33.   Stream* = POINTER TO StreamDesc;
  34.   StreamDesc* = RECORD END;
  35.  
  36.   PROCEDURE (s: Stream) Open* (name: ARRAY OF CHAR; new: BOOLEAN): BOOLEAN;
  37.     BEGIN HALT(99)
  38.   END Open;
  39.  
  40.   PROCEDURE (s: Stream) Close* (): BOOLEAN;
  41.     BEGIN HALT(99)
  42.   END Close;
  43.  
  44.   PROCEDURE (s: Stream) Write* (ch: CHAR);
  45.     BEGIN HALT(99)
  46.   END Write;
  47.  
  48.   PROCEDURE (s: Stream) WriteLn*;
  49.     BEGIN
  50.       s.Write("\n");
  51.   END WriteLn;
  52.  
  53.   PROCEDURE (s: Stream) WriteString* (a: ARRAY OF CHAR);
  54.     VAR i : INTEGER;
  55.     BEGIN
  56.       i:=0;
  57.       WHILE a[i]#0X DO s.Write(a[i]); INC(i); END
  58.   END WriteString;
  59.  
  60.   PROCEDURE (s: Stream) WriteLongInt* (value: LONGINT; width: INTEGER);
  61.     VAR n : LONGINT;
  62.       i,k : INTEGER;
  63.       neg : BOOLEAN;
  64.         d : ARRAY 14 OF CHAR;
  65.     BEGIN
  66.       n := value; neg := n<0; i := 0;
  67.       IF neg THEN n := -n; DEC(width) END;
  68.       REPEAT
  69.         d[i] := CHR(ORD("0")+n MOD 10);
  70.         n := n DIV 10;
  71.         INC(i);
  72.       UNTIL n=0;
  73.       FOR k := i TO width-1 DO s.Write(" ") END;
  74.       IF neg THEN s.Write("-") END;
  75.       REPEAT
  76.         DEC(i);
  77.         s.Write(d[i])
  78.       UNTIL i=0;
  79.   END WriteLongInt;
  80.  
  81.   PROCEDURE (s: Stream) WriteInt* (value, width: INTEGER);
  82.     BEGIN
  83.       s.WriteLongInt(value, width)
  84.   END WriteInt;
  85.  
  86.   PROCEDURE (s: Stream) WriteShortInt* (value: SHORTINT; width: INTEGER);
  87.     BEGIN
  88.       s.WriteLongInt(value, width)
  89.   END WriteShortInt;
  90.  
  91.   PROCEDURE (s: Stream) WriteHex* (value: LONGINT; width: INTEGER);
  92.     VAR n : LONGINT;
  93.       i,k : INTEGER;
  94.       neg : BOOLEAN;
  95.         d : ARRAY 14 OF CHAR;
  96.     BEGIN
  97.       n := value; neg := n<0; i := 0;
  98.       IF neg THEN n := -n; DEC(width) END;
  99.       REPEAT
  100.         CASE (n MOD 16) OF
  101.             0..9:    d[i] := CHR(ORD("0")+n MOD 16);
  102.           | 10..15:  d[i] := CHR((ORD("A")+n MOD 16)-10)
  103.         END;
  104.         n := n DIV 16;
  105.         INC(i);
  106.       UNTIL n=0;
  107.       IF neg THEN s.Write("-") END;
  108.       FOR k := i TO width-1 DO s.Write("0") END;
  109.       REPEAT
  110.         DEC(i);
  111.         s.Write(d[i])
  112.       UNTIL i=0;
  113.   END WriteHex;
  114.  
  115.   PROCEDURE (s: Stream) Read* (VAR ch: CHAR);
  116.     BEGIN HALT (99)
  117.   END Read;
  118.  
  119.   PROCEDURE (s: Stream) ReadString* (VAR a: ARRAY OF CHAR);
  120.     VAR i : INTEGER;
  121.     BEGIN
  122.       i := 0;
  123.       REPEAT
  124.         s.Read(a[i]);
  125.         CASE a[i] OF
  126.           "\n",eof,0X:      a[i] := 0X; RETURN
  127.         ELSE
  128.         END;
  129.         INC(i);
  130.       UNTIL i=LEN(a);
  131.   END ReadString;
  132.  
  133.   PROCEDURE (s: Stream) ReadLongInt* (VAR value: LONGINT): BOOLEAN;
  134.   VAR
  135.     ch: CHAR;
  136.     d: LONGINT;
  137.     neg: BOOLEAN;
  138.     str: ARRAY 40 OF CHAR;
  139.     i: INTEGER;
  140.   BEGIN
  141.     value := 0; i := 0;
  142.     s.ReadString(str);
  143.     neg := FALSE;
  144.     IF str[0]="-" THEN neg := TRUE; i := 1 END;
  145.     LOOP
  146.       ch := str[i];
  147.       CASE ch OF
  148.       0X: IF neg THEN value := -value END; RETURN TRUE |
  149.       "0".."9":
  150.         d := ORD(ch)-ORD("0");
  151.         IF (MAX(LONGINT)-d) DIV 10 >= value THEN value := 10*value+d ELSE EXIT END |
  152.       ELSE EXIT END;
  153.       INC(i);
  154.     END;
  155.     RETURN FALSE;
  156.   END ReadLongInt;
  157.  
  158.   PROCEDURE (s: Stream) ReadInt*(VAR value: INTEGER): BOOLEAN;
  159.   VAR
  160.     l: LONGINT;
  161.   BEGIN
  162.     IF s.ReadLongInt(l) & (l>=MIN(INTEGER)) & (l<=MAX(INTEGER)) THEN
  163.       value := SHORT(l);
  164.       RETURN TRUE;
  165.     END;
  166.     RETURN FALSE;
  167.   END ReadInt;
  168.  
  169.  
  170.   PROCEDURE (s: Stream) ReadShortInt*(VAR value: SHORTINT): BOOLEAN;
  171.   VAR
  172.     l: LONGINT;
  173.   BEGIN
  174.     IF s.ReadLongInt(l) & (l>=MIN(SHORTINT)) & (l<=MAX(SHORTINT)) THEN
  175.       value := SHORT(SHORT(l));
  176.       RETURN TRUE;
  177.     END;
  178.     RETURN FALSE;
  179.   END ReadShortInt;
  180.  
  181.  
  182.   PROCEDURE (s: Stream) ReadHex*(VAR value: LONGINT): BOOLEAN;
  183.   VAR
  184.     ch: CHAR;
  185.     d: LONGINT;
  186.     str: ARRAY 40 OF CHAR;
  187.     i: INTEGER;
  188.   BEGIN
  189.     value := 0; i := 0;
  190.     s.ReadString(str);
  191.     LOOP
  192.       ch := CAP(str[i]);
  193.       CASE ch OF
  194.       0X:       RETURN TRUE |
  195.       "0".."9": DEC(ch,ORD("0")) |
  196.       "A".."F": DEC(ch,ORD("A")-10) |
  197.       ELSE EXIT END;
  198.       d := ORD(ch);
  199.       IF (MAX(LONGINT)-d) DIV 16 >= value THEN value := 16*value+d ELSE EXIT END;
  200.       INC(i);
  201.     END;
  202.     RETURN FALSE;
  203.   END ReadHex;
  204.  
  205. END Streams.
  206.